<!DOCTYPE html>
<html lang="zh">
	<head>
		<meta charset="utf-8" />
		<base href="../../../" />
		<script src="page.js"></script>
		<link type="text/css" rel="stylesheet" href="page.css" />
	</head>
	<body>
		<h1>[name]</h1>

		<p>
			是面片、线或点几何体的有效表述。包括顶点位置，面片索引、法相量、颜色值、UV 坐标和自定义缓存属性值。使用 BufferGeometry
			可以有效减少向 GPU 传输上述数据所需的开销。
		</p>
		<p>
			读取或编辑 BufferGeometry 中的数据，见 [page:BufferAttribute] 文档。
		</p>

		<h2>代码示例</h2>
		<code>
		const geometry = new THREE.BufferGeometry();
		// 创建一个简单的矩形. 在这里我们左上和右下顶点被复制了两次。
		// 因为在两个三角面片里，这两个顶点都需要被用到。
		const vertices = new Float32Array( [
			-1.0, -1.0,  1.0,
			 1.0, -1.0,  1.0,
			 1.0,  1.0,  1.0,

			 1.0,  1.0,  1.0,
			-1.0,  1.0,  1.0,
			-1.0, -1.0,  1.0
		] );

		// itemSize = 3 因为每个顶点都是一个三元组。
		geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );
		const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );
		const mesh = new THREE.Mesh( geometry, material );
		</code>

		<h2>例子</h2>
		<p>
			[example:webgl_buffergeometry Mesh with non-indexed faces]<br />
			[example:webgl_buffergeometry_indexed Mesh with indexed faces]<br />
			[example:webgl_buffergeometry_lines Lines]<br />
			[example:webgl_buffergeometry_lines_indexed Indexed Lines]<br />
			[example:webgl_buffergeometry_custom_attributes_particles Particles]<br />
			[example:webgl_buffergeometry_rawshader Raw Shaders]
		</p>

		<h2>构造函数</h2>


		<h3>[name]()</h3>
		<div>
		创建一个新的 [name]. 同时将预置属性设置为默认值.
		</div>


		<h2>属性</h2>

		<h3>[property:Object attributes]</h3>
		<p>
			通过 hashmap 存储该几何体相关的属性，hashmap 的 id 是当前 attribute 的名称，值是相应的 [page:BufferAttribute buffer]。
			你可以通过 [page:.setAttribute] 和 [page:.getAttribute] 添加和访问与当前几何体有关的 attribute。
		</p>

		<h3>[property:Box3 boundingBox]</h3>
		<p>
			当前 bufferGeometry 的外边界矩形。可以通过 [page:.computeBoundingBox]() 计算。默认值是 *null*。
		</p>

		<h3>[property:Sphere boundingSphere]</h3>
		<p>
			当前 bufferGeometry 的外边界球形。可以通过 [page:.computeBoundingSphere]() 计算。默认值是 *null*。
		</p>

		<h3>[property:Object drawRange]</h3>
		<p>
			用于判断几何体的哪个部分需要被渲染。该值不应该直接被设置，而需要通过 [page:.setDrawRange] 进行设置。<br />
			默认值为
			<code>
				{ start: 0, count: Infinity }
			</code>
		</p>

		<h3>[property:Array groups]</h3>
		<p>
			将当前几何体分割成组进行渲染，每个部分都会在单独的 WebGL 的 draw call 中进行绘制。该方法可以让当前的 bufferGeometry
			可以使用一个材质队列进行描述。<br /><br />

			分割后的每个部分都是一个如下的表单：
			<code>{ start: Integer, count: Integer, materialIndex: Integer }</code>
			start 表明当前 draw call 中的没有索引的几何体的几何体的第一个顶点；或者第一个三角面片的索引。
			count 指明当前分割包含多少顶点（或 indices）。
			materialIndex 指出当前用到的材质队列的索引。<br /><br />

			通过 [page:.addGroup] 来增加组，而不是直接更改当前队列。
		</p>


		<!-- Note: groups used to be called drawCalls

		<h3>[property:Array drawcalls]</h3>
		<p>
		For geometries that use indexed triangles, this Array can be used to split the object
		into multiple WebGL draw calls. Each draw call will draw some subset of the vertices
		in this geometry using the configured [page:Material shader]. This may be necessary if,
		for instance, you have more than 65535 vertices in your object.
		</p> -->


		<h3>[property:Integer id]</h3>
		<p>当前 bufferGeometry 的唯一编号。</p>

		<h3>[property:BufferAttribute index]</h3>
		<p>
			允许顶点在多个三角面片间可以重用。这样的顶点被称为"已索引的三角面片（indexed triangles)。
			每个三角面片都和三个顶点的索引相关。该 attribute 因此所存储的是每个三角面片的三个顶点的索引。

			如果该 attribute 没有设置过，则 [page:WebGLRenderer renderer] 假设每三个连续的位置代表一个三角面片。

			默认值是 *null*。
		</p>

		<h3>[property:Object morphAttributes]</h3>
		<p>
			存储 [page:BufferAttribute] 的 Hashmap，存储了几何体 morph targets 的细节信息。
		</p>

		<h3>[property:Boolean morphTargetsRelative]</h3>
		<p>
			Used to control the morph target behavior; when set to true, the morph target data is treated as relative offsets, rather than as absolute positions/normals.

			Default is *false*.
		</p>

		<h3>[property:String name]</h3>
		<p>
			当前 bufferGeometry 实例的可选别名。默认值是空字符串。
		</p>

		<h3>[property:Object userData]</h3>
		<p>
			存储 BufferGeometry 的自定义数据的对象。为保持对象在克隆时完整，该对象不应该包括任何函数的引用。
		</p>

		<h3>[property:String uuid]</h3>
		<p>
			当前对象实例的 [link:http://en.wikipedia.org/wiki/Universally_unique_identifier UUID]，该值会自动被分配，且不应被修改。
		</p>

		<h2>方法</h2>

		<h3>[page:EventDispatcher EventDispatcher] 在该类上可用的所有方法。</h3>

		<h3>[method:BufferGeometry setAttribute]( [param:String name], [param:BufferAttribute attribute] )</h3>
		<p>
			为当前几何体设置一个 attribute 属性。在类的内部，有一个存储 [page:.attributes] 的 hashmap，
			通过该 hashmap，遍历 attributes 的速度会更快。而使用该方法，可以向 hashmap 内部增加 attribute。
			所以，你需要使用该方法来添加 attributes。
		</p>

		<h3>[method:null addGroup]( [param:Integer start], [param:Integer count], [param:Integer materialIndex] )</h3>
		<p>
			为当前几何体增加一个 group，详见 [page:BufferGeometry.groups groups] 属性。
		</p>


		<h3>[method:null applyMatrix4]( [param:Matrix4 matrix] )</h3>
		<p> 用给定矩阵转换几何体的顶点坐标。</p>

		<h3>[method:BufferGeometry center] ()</h3>
		<p>根据边界矩形将几何体居中。</p>

		<h3>[method:BufferGeometry clone]()</h3>
		<p>克隆当前的 BufferGeometry。</p>

		<h3>[method:BufferGeometry copy]( [param:BufferGeometry bufferGeometry] )</h3>
		<p>将参数指定的 BufferGeometry 的值拷贝到当前 BufferGeometry 中。</p>

		<h3>[method:null clearGroups]( )</h3>
		<p>清空所有的 groups。</p>

		<h3>[method:null computeBoundingBox]()</h3>
		<p>
			计算当前几何体的的边界矩形，该操作会更新已有 [param:.boundingBox]。<br />
			边界矩形不会默认计算，需要调用该接口指定计算边界矩形，否则保持默认值 *null*。
		</p>

		<h3>[method:null computeBoundingSphere]()</h3>
		<p>
			计算当前几何体的的边界球形，该操作会更新已有 [param:.boundingSphere]。<br />
			边界球形不会默认计算，需要调用该接口指定计算边界球形，否则保持默认值 *null*。
		</p>

		<h3>[method:null computeTangents]()</h3>
		<p>
		Calculates and adds a tangent attribute to this geometry.<br />
		The computation is only supported for indexed geometries and if position, normal, and uv attributes are defined.
		</p>

		<h3>[method:null computeVertexNormals]()</h3>
		<p>通过面片法向量的平均值计算每个顶点的法向量。</p>

		<h3>[method:null dispose]()</h3>
		<p>
			从内存中销毁对象。 <br />
			如果在运行是需要从内存中删除 BufferGeometry，则需要调用该函数。
		</p>

		<h3>[method:BufferAttribute getAttribute]( [param:String name] )</h3>
		<p>返回指定名称的 [page:BufferAttribute attribute]。</p>

		<h3>[method:BufferAttribute getIndex] ()</h3>
		<p>返回缓存相关的 [page:.index]。</p>

		<h3>[method:Boolean hasAttribute]( [param:String name] )</h3>
		<p>Returns *true* if the attribute with the specified name exists.</p>

		<h3>[method:BufferGeometry lookAt] ( [param:Vector3 vector] )</h3>
		<p>
			vector - 几何体所朝向的世界坐标。<br /><br />

			旋转几何体朝向控件中的一点。该过程通常在一次处理中完成，不会循环处理。典型的用法是过通过调用 [page:Object3D.lookAt] 实时改变 mesh 朝向。
		</p>

		<h3>[method:null merge]( [param:BufferGeometry bufferGeometry], [param:Integer offset] )</h3>
		<p>同参数指定的 BufferGeometry 进行合并。可以通过可选参数指定，从哪个偏移位置开始进行 merge。</p>

		<h3>[method:null normalizeNormals]()</h3>
		<p>
			几何体中的每个法向量长度将会为 1。这样操作会更正光线在表面的效果。
		</p>

		<h3>[method:BufferAttribute deleteAttribute]( [param:String name] )</h3>
		<p>删除具有指定名称的 [page:BufferAttribute attribute]。</p>

		<h3>[method:BufferGeometry rotateX] ( [param:Float radians] )</h3>
		<p>
			在 X 轴上旋转几何体。该操作一般在一次处理中完成，不会循环处理。典型的用法是通过调用 [page:Object3D.rotation] 实时旋转几何体。
		</p>

		<h3>[method:BufferGeometry rotateY] ( [param:Float radians] )</h3>
		<p>
			在 Y 轴上旋转几何体。该操作一般在一次处理中完成，不会循环处理。典型的用法是通过调用 [page:Object3D.rotation] 实时旋转几何体。
		</p>

		<h3>[method:BufferGeometry rotateZ] ( [param:Float radians] )</h3>
		<p>
			在 Z 轴上旋转几何体。该操作一般在一次处理中完成，不会循环处理。典型的用法是通过调用 [page:Object3D.rotation] 实时旋转几何体。
		</p>

		<h3>[method:BufferGeometry scale] ( [param:Float x], [param:Float y], [param:Float z] )</h3>
		<p>
			缩放几何体。该操作一般在一次处理中完成，不会循环处理。典型的用法是通过调用 [page:Object3D.scale] 实时旋转几何体。
		</p>

		<h3>[method:BufferGeometry setIndex] ( [param:BufferAttribute index] )</h3>
		<p>设置缓存的 [page:.index]。</p>

		<h3>[method:null setDrawRange] ( [param:Integer start], [param:Integer count] )</h3>
		<p>设置缓存的 [page:.drawRange]。详见相关属性说明。</p>

		<h3>[method:BufferGeometry setFromPoints] ( [param:Array points] )</h3>
		<p>通过点队列设置该 BufferGeometry 的 attribute。</p>

		<h3>[method:Object toJSON]()</h3>
		<p>返回代表该 BufferGeometry 的 JSON 对象。</p>

		<h3>[method:BufferGeometry toNonIndexed]()</h3>
		<p>返回已索引的 BufferGeometry 的非索引版本。</p>

		<h3>[method:BufferGeometry translate] ( [param:Float x], [param:Float y], [param:Float z] )</h3>
		<p>
			移动几何体。该操作一般在一次处理中完成，不会循环处理。典型的用法是通过调用 [page:Object3D.rotation] 实时旋转几何体。
		</p>

		<h2>Source</h2>

		<p>
			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
		</p>
	</body>
</html>
